package cn.zcib.film.util;

import java.util.ArrayList;
import java.util.List;

public class TreeUtil {

    public static List<MenuNode> toTree(List<MenuNode> treeList, Integer pid) {
        List<MenuNode> retList = new ArrayList<>();
        //pid为0，会筛选出一级菜单对象
        for (MenuNode parent : treeList) {
            //找出一级菜单
            if (pid.equals(parent.getPid())) {
                //findChildren会返回MenuNode
                //最终返回一个封装到了三级按钮的menuNode（一级菜单对象）
                //并添加进去
                retList.add(findChildren(parent, treeList));
            }
        }
        //遍历完毕，所有一级菜单都被封装完毕，返回一个list
        return retList;
    }

    /**
     *
     * @param parent 父菜单
     * @param treeList  整个List
     * @return
     */
    private static MenuNode findChildren(MenuNode parent, List<MenuNode> treeList) {
        //递归进入，就是二级菜单的对象，会找出三级按钮，进行同样操作
        for (MenuNode child : treeList) {
            //如果菜单的pid为上级菜单的id，那么他就是下级菜单
            if (parent.getId().equals(child.getPid())) {
                //建立父子级联系
                //如果父菜单的child属性为空，则新建list用以存放二级菜单
                if (parent.getChild() == null) {
                    parent.setChild(new ArrayList<>());
                }
                //为父级菜单的child添加此二级菜单，并且将二级菜单对象递归
                //一级菜单add，会返回封装了二级菜单的menuNode
                //二级菜单add，会返回封装了三级按钮的menuNode
                parent.getChild().add(findChildren(child, treeList));
            }
        }
        //最终返回一个封装到了三级按钮的menuNode（一级菜单对象）
        return parent;
    }
}
